/* -*- c -*- */ %{ #include #include #include /* #define DEBUG */ FILE *out = NULL; char buf[2048], sectname[256], labeltxt[256]; char firstname[256], outname[256]; char ssectname[256], Tmp1[4096], Tmp2[256], headname[256]; char urlname[256], Headbuf[4096], refname[256]; int filenum = 1; int tmpfn; int secnr = 0; int ssecnr; int current; int skipnewline = 0; #define CHAPTER 1 #define SECTION 2 #define SUBSECT 3 int getstr( char *str, int n ) { int i; #ifdef DEBUG fprintf( stderr, "DEBUG: yytext: <<%s>>\n", yytext ); #endif if( strlen( yytext ) == n ) return 0; strncpy( str, yytext+n, yyleng-n); str[ yyleng-n ] = 0; return 1; } struct lprec { char *label; int fileno; struct lprec *next; }; typedef struct lprec lprec; lprec *putlp(); lprec *getlp(); lprec *lp_table = (lprec *)0; lprec *tmplp; lprec * putlp( char *lbl, int fn ) { lprec *ptr; ptr = (lprec *) malloc (sizeof (lprec)); ptr->label = (char *) malloc (strlen (lbl) +1 ); strcpy( ptr->label, lbl ); ptr->fileno = fn; ptr->next = (struct lprec *)lp_table; lp_table = ptr; return ptr; } lprec * getlp( char *lbl ) { lprec *ptr; for (ptr = lp_table; ptr != (lprec *) 0; ptr = (lprec *)ptr->next) if (strcmp (ptr->label,lbl) == 0) return ptr; return 0; } %} %s SECT %% ^"<@@url>".*$ { skipnewline=1; getstr( urlname, 7 ); sprintf( Headbuf, " ", urlname); } ^"<@@urlnam>".*$ { sprintf( Tmp1, " %s ", urlname); strcat (Headbuf, Tmp1); } ^"<@@endurl>".*$ { skipnewline=0; if (out) { fprintf( out, "%s", Headbuf); } else { printf( "%s", Headbuf); } strcpy (Headbuf,""); } ^"<@@title>".*$ { strcpy( sectname, yytext+9 ); printf( "%s\n

%s

\n", sectname, sectname ); } ^"<@@head>".*$ { skipnewline=1; getstr( headname, 8 ); sprintf( Headbuf, "

%s ", headname); } ^"<@@endhead>".*$ { if (out) { fprintf( out, "%s", Headbuf ); strcpy(Headbuf, ""); switch (current){ case CHAPTER: current=0; break; case SECTION: current=0; fprintf( out, "

\n

Contents of this section

\n",firstname,secnr); break; case SUBSECT: current=0; fprintf( out, "\n"); break; default: current=0; fprintf( out, "\n"); break; } } else { printf("%s", Headbuf ); strcpy(Headbuf, ""); switch (current){ case CHAPTER: current=0; break; case SECTION: current=0; printf("\n

Contents of this section

\n",firstname,secnr); break; case SUBSECT: current=0; printf("\n"); break; default: current=0; printf("\n"); break; } } skipnewline=0; } ^"<@@sect>".*$ { skipnewline=1; getstr( sectname, 8 ) ; if( out ) { fclose( out ); } current=SECTION; secnr++; ssecnr=0; sprintf( outname, "%s-%d.html", firstname, filenum++ ); out = fopen( outname, "w" ); fprintf( out, "%s\n", sectname ); sprintf( Headbuf, "

%d %s ",secnr, secnr, sectname ); fprintf( stdout, "

",secnr); fprintf( stdout, "%d. %s

\n
    \n", secnr, outname, sectname ); } ^"<@@ssect>".*$ { skipnewline=1; getstr( ssectname, 9 ) ; current=SUBSECT; ssecnr++; sprintf( Headbuf, "

    %d.%d %s ",secnr, ssecnr, secnr, ssecnr, ssectname ); fprintf( stdout, "

    %d.%d %s

    \n", outname, secnr, ssecnr, secnr, ssecnr, ssectname ); } ^"<@@chapt>".*$ { getstr( sectname, 9 ); sectname[ yyleng-14 ] = 0; printf( "

    %s

    \n", sectname ); } ^"<@@endchapt>".*$ ; ^"<@@endsect>".*$ { if (filenum>=3) { sprintf(Tmp1,"%s-%d.html",firstname, (filenum - 2)); } else { sprintf(Tmp1,"%s.html",firstname); } sprintf(Tmp2,"%s-%d.html",firstname, (filenum )); fprintf(out, "

    Next Chapter, Previous Chapter

    ", Tmp2, Tmp1); sprintf(Tmp2,"%s.html",firstname); fprintf(out, "

    Table of contents of this chapter,\n",Tmp2, filenum-1 ); fprintf(out, " General table of contents

    \n",Tmp2); fprintf(out, "

    Top of the document,\n Beginning of this Chapter

    ", Tmp2); fprintf(stdout,"
\n"); fclose(out); out = NULL; } ^"<@@endssect>".*$ { } ^"<@@label>".*$ { strcpy( sectname, yytext+9 ); if (!getlp( sectname )) { fprintf( stderr, "Problem with @@label!\n" ); } else { strcpy( labeltxt, sectname ); } } ^"<@@label>".*$ { strcpy( sectname, yytext+9 ); if (!getlp( sectname )) { fprintf( stderr, "Problem with @@label!\n" ); } else { if( skipnewline ) { sprintf( Tmp1, " %s", sectname, Headbuf); strcpy (Headbuf, Tmp1); strcpy (Tmp1,""); } else if( out ) { fprintf( out, " ", sectname ); } else { printf( " ", sectname ); } } } ^"<@@labelp>".*$ { #ifdef DEBUG fprintf( stderr, "DEBUG: yytext = <<%s>>\n", yytext ); #endif if (sscanf( yytext, "<@@labelp>%[^#]#%d", sectname, &tmpfn ) != 2) { fprintf( stderr, "Problem with @@labelp!\n" ); #ifdef DEBUG fprintf( stderr, "DEBUG: sectname = <<%s>>\n", sectname ); fprintf( stderr, "DEBUG: tmpfn = <<%d>>\n", tmpfn ); #endif } else putlp( sectname, tmpfn ); } ^"<@@ref>".*$ { strcpy( refname, yytext+7 ); if (!(tmplp = getlp( refname ))) { fprintf( stderr, "Problem with @@ref!\n" ); skipnewline++; } else { if(tmplp->fileno==secnr) { sprintf( Tmp1, " ", refname ); } else if(tmplp->fileno==0) { sprintf( Tmp1, " ", firstname, refname ); } else { sprintf( Tmp1, " ", firstname, tmplp->fileno, refname ); } if(skipnewline) { strcat( Headbuf, Tmp1); } else { strcpy( Headbuf, Tmp1); } skipnewline++ ; } } ^"<@@refnam>".*$ { sprintf( Tmp1," %s ", refname ); strcat ( Headbuf, Tmp1); } ^"<@@endref>".*$ { switch (skipnewline) { case 1: if (out) { fprintf( out, "%s", Headbuf ); } else { printf( "%s", Headbuf); } break; case 2: break; default: fprintf( stderr, "Problem with @@endref!\n" ); break; } skipnewline--; } ^.*$ { getstr( sectname, 0 ); if( out ) { fclose( out ); } sprintf( outname, "%s-%d.html", firstname, filenum++ ); out = fopen( outname, "w" ); fprintf( out, "%s\n", sectname ); if( strlen( labeltxt )) { fprintf( out, "\n", labeltxt ); labeltxt[0] = 0; } fprintf( out, "

%s

", sectname ); fprintf( stdout, "

%s

\n", outname, sectname ); BEGIN(0); } .* { if (skipnewline) { strcat(Headbuf, yytext ); } else if( out ) { fprintf( out, "%s", yytext ); } else { ECHO; } } \n { if(!skipnewline) { if( out ) { fprintf( out, "%s", yytext ); } else { ECHO; } } } %% void main( int argc, char **argv ) { if( argc >= 2 ) { strncpy( firstname, argv[1], 256 ); } else { strcpy( firstname, "$$" ); } secnr=0; yylex(); if( out ) fclose( out ); exit( 0 ); }